From: Caolán McNamara Date: Sat, 13 Jun 2026 13:27:30 +0000 (+0000) Subject: [PATCH] limit palette index X-Git-Tag: archive/raspbian/4%25.2.3-2+rpi1+deb13u7^2~1 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=63aef763da0714004cb7a449a29526e6060dc85e;p=libreoffice.git [PATCH] limit palette index use the same SanitizePaletteIndex guard ipsd and iras already have. Signed-off-by: Caolán McNamara Change-Id: Iff3450ab2c3781c5181b3f28ed2a321d1e49c6ae Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/4425 Tested-by: Jenkins CPCI (cherry picked from commit ada76821319b80671dba9908aeea8cabba5cedc0) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/206612 Tested-by: Jenkins Reviewed-by: Xisco Fauli (cherry picked from commit 6bc93227e7c603d3f314202b89b6c567680e6261) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/206670 Gbp-Pq: Name CVE-2026-63279.diff --- diff --git a/vcl/source/filter/ipict/ipict.cxx b/vcl/source/filter/ipict/ipict.cxx index 2d9be6f8cd9..545dfe33364 100644 --- a/vcl/source/filter/ipict/ipict.cxx +++ b/vcl/source/filter/ipict/ipict.cxx @@ -268,43 +268,56 @@ public: } +static const Color& SanitizePaletteIndex(std::vector const & rvPalette, sal_uInt8 nIndex) +{ + if (nIndex >= rvPalette.size()) + { + auto nSanitizedIndex = nIndex % rvPalette.size(); + SAL_WARN_IF(nIndex != nSanitizedIndex, "filter.pict", "invalid palette index: " + << static_cast(nIndex) << ", palette len is: " + << rvPalette.size()); + nIndex = nSanitizedIndex; + } + return rvPalette[nIndex]; +} + static void SetByte(sal_uInt16& nx, sal_uInt16 ny, vcl::bitmap::RawBitmap& rBitmap, sal_uInt16 nPixelSize, sal_uInt8 nDat, sal_uInt16 nWidth, std::vector const & rvPalette) { switch (nPixelSize) { case 1: - rBitmap.SetPixel(ny, nx++, rvPalette[(nDat >> 7) & 1]); + rBitmap.SetPixel(ny, nx++, SanitizePaletteIndex(rvPalette, (nDat >> 7) & 1)); if ( nx == nWidth ) break; - rBitmap.SetPixel(ny, nx++, rvPalette[(nDat >> 6) & 1]); + rBitmap.SetPixel(ny, nx++, SanitizePaletteIndex(rvPalette, (nDat >> 6) & 1)); if ( nx == nWidth ) break; - rBitmap.SetPixel(ny, nx++, rvPalette[(nDat >> 5) & 1]); + rBitmap.SetPixel(ny, nx++, SanitizePaletteIndex(rvPalette, (nDat >> 5) & 1)); if ( nx == nWidth ) break; - rBitmap.SetPixel(ny, nx++, rvPalette[(nDat >> 4) & 1]); + rBitmap.SetPixel(ny, nx++, SanitizePaletteIndex(rvPalette, (nDat >> 4) & 1)); if ( nx == nWidth ) break; - rBitmap.SetPixel(ny, nx++, rvPalette[(nDat >> 3) & 1]); + rBitmap.SetPixel(ny, nx++, SanitizePaletteIndex(rvPalette, (nDat >> 3) & 1)); if ( nx == nWidth ) break; - rBitmap.SetPixel(ny, nx++, rvPalette[(nDat >> 2) & 1]); + rBitmap.SetPixel(ny, nx++, SanitizePaletteIndex(rvPalette, (nDat >> 2) & 1)); if ( nx == nWidth ) break; - rBitmap.SetPixel(ny, nx++, rvPalette[(nDat >> 1) & 1]); + rBitmap.SetPixel(ny, nx++, SanitizePaletteIndex(rvPalette, (nDat >> 1) & 1)); if ( nx == nWidth ) break; - rBitmap.SetPixel(ny, nx++, rvPalette[nDat & 1]); + rBitmap.SetPixel(ny, nx++, SanitizePaletteIndex(rvPalette, nDat & 1)); break; case 2: - rBitmap.SetPixel(ny, nx++, rvPalette[nDat >> 6]); + rBitmap.SetPixel(ny, nx++, SanitizePaletteIndex(rvPalette, nDat >> 6)); if ( nx == nWidth ) break; - rBitmap.SetPixel(ny, nx++, rvPalette[(nDat>>4)&3]); + rBitmap.SetPixel(ny, nx++, SanitizePaletteIndex(rvPalette, (nDat>>4)&3)); if ( nx == nWidth ) break; - rBitmap.SetPixel(ny, nx++, rvPalette[(nDat>>2)&3]); + rBitmap.SetPixel(ny, nx++, SanitizePaletteIndex(rvPalette, (nDat>>2)&3)); if ( nx == nWidth ) break; - rBitmap.SetPixel(ny, nx++, rvPalette[nDat & 3]); + rBitmap.SetPixel(ny, nx++, SanitizePaletteIndex(rvPalette, nDat & 3)); break; case 4: - rBitmap.SetPixel(ny, nx++, rvPalette[nDat >> 4]); + rBitmap.SetPixel(ny, nx++, SanitizePaletteIndex(rvPalette, nDat >> 4)); if ( nx == nWidth ) break; - rBitmap.SetPixel(ny, nx++, rvPalette[nDat & 0x0f]); + rBitmap.SetPixel(ny, nx++, SanitizePaletteIndex(rvPalette, nDat & 0x0f)); break; case 8: - rBitmap.SetPixel(ny, nx++, rvPalette[nDat]); + rBitmap.SetPixel(ny, nx++, SanitizePaletteIndex(rvPalette, nDat)); break; } }